package watermark;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;

public class WaterMark {
    public static void main(String[] args) {
        File dir = new File("D:\\tmp\\origin\\");
        File[] files = dir.listFiles();
        for (File file : files) {
            markImageBySingleIcon("D:\\tmp\\1.png", file.getAbsolutePath(), "d:\\tmp\\dest\\", file.getName(), "jpg", null);
        }
    }

    /**
     * icon 水印图片路径（如：F:/images/icon.png）
     * source 没有加水印的图片路径（如：F:/images/6.jpg）
     * output 加水印后的图片路径（如：F:/images/）
     * imageName 图片名称（如：11111）
     * imageType 图片类型（如：jpg）
     * degree 水印图片旋转角度，为null表示不旋转
     */
    public static Boolean markImageBySingleIcon(String icon, String source, String output, String imageName, String imageType, Integer degree) {

        try {
            File sourceFile = new File(source);
            File iconFile = new File(icon);

            if (!sourceFile.isFile()) {
                return false;
            }

            //将icon加载到内存中
            Image iconImage = ImageIO.read(iconFile);
            //icon高度
            int iconHeight = iconImage.getHeight(null);
            int iconWidth = iconImage.getWidth(null);
            //将源图片读到内存中
            Image img = ImageIO.read(sourceFile);

            //图片宽
            int imageWidth = img.getWidth(null);
            //图片高
            int imageHeight = img.getHeight(null);

            BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
            //创建一个指定 BufferedImage 的 Graphics2D 对象
            Graphics2D g = bi.createGraphics();

            //x,y轴默认是从0坐标开始
            int x = 0;
            int y = 0;

            //设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            //呈现一个图像，在绘制前进行从图像空间到用户空间的转换
            g.drawImage(img.getScaledInstance(imageWidth, imageHeight, Image.SCALE_SMOOTH), 0, 0, null);

            //水印图象的路径 水印一般为gif或者png的，这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(icon);
            //得到Image对象。
            Image con = imgIcon.getImage();
//            //透明度，最小值为0，最大值为1
            //表示水印图片的坐标位置(x,y)
            drawStretchedImage(img, g, iconImage, null, false, x, y);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            g.dispose();
            File sf = new File(output, imageName + "." + imageType);
            ImageIO.write(bi, imageType, sf); // 保存图片

        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    public static void drawStretchedImage(Image origin,
                                          Graphics2D g2, Image image, ImageObserver observer,
                                          boolean keepAspect, int x, int y) {
//        int x = (int) origin.getX();
//        int y = (int) origin.getY();
        int w = (int) origin.getWidth(null);
        int h = (int) origin.getHeight(null);
        if (keepAspect) {
            int imageWidth = image.getWidth(observer);
            int imageHeight = image.getHeight(observer);
            if ((imageWidth > 0) && (imageHeight > 0)) {
                double scaleWidth = origin.getWidth(null) / imageWidth;
                double scaleHeight = origin.getHeight(null) / imageHeight;
//
//                if (scaleWidth < scaleHeight) {
//                    h = (int) (scaleWidth * imageHeight);
//
//                    y = y
//                            + (int) Math.max(0, Math.round((origin
//                            .getHeight(null) - h) / 2));
//                } else {
//                    w = (int) (scaleHeight * imageWidth);
//
//                    x = x
//                            + (int) Math
//                            .max(0,
//                                    Math.round((origin.getWidth(null) - w) / 2));
//                }
            }
        }

        g2.drawImage(image, x, y, w, h, observer);
    }
}
